package com.xcc.dataStructures.demo05_recursion;

import java.util.Arrays;

/**
 * 八皇后问题
 * 1) 第一个皇后先放第一行第一列
 * 2) 第二个皇后放在第二行第一列、然后判断是否 OK， 如果不 OK，继续放在第二列、第三列、依次把所有列都 放完，找到一个合适
 * 3) 继续第三个皇后，还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置，算是找到了一个正确 解
 * 4) 当得到一个正确解时，在栈回退到上一个栈时，就会开始回溯，即将第一个皇后，放到第一列的所有正确解， 全部得到.
 *
 * @author xiaocheng
 * @date 2020/12/2 9:46
 */
public class Queue8 {

    int max = 8;
    int[] arr = new int[max];

    //一共存在的方法
    static int count = 0;
    static int judgeNum = 0;

    public static void main(String[] args) {
        Queue8 queue8 = new Queue8();
        queue8.check(0);
        System.out.println("排序的方法一共有:" + count);
        System.out.println("一共循环多少次:" + judgeNum);
    }

    /**
     * 放置第n个皇后
     *
     * @param n
     */
    private void check(int n) {
        //如果排序到最大值  就退出循环
        if (n >= max) {
            count++;
            System.out.println(Arrays.toString(arr));
            return;
        }
        for (int i = 0; i < max; i++) {
            //先设置第n个皇后的值为i
            arr[n] = i;
            //判断当前皇后值是否符合，如果符合就进行下一个
            if (judge(n)) {
                check(n + 1);
            }
        }
    }

    private boolean judge(int n) {
        judgeNum++;
        for (int i = 0; i < n; i++) {
            int index = Math.abs(n - i);
            int val = Math.abs(arr[n] - arr[i]);
            if (index == val || n == i || arr[n] == arr[i]) {
                return false;
            }
        }
        return true;
    }


}
